package com.atguigu;

import lombok.Getter;

import java.util.ArrayList;

/**
 * 类是核心
 * 1. 包含最新的天气情况信息
 * 2. 含有观察者集合，使用ArrayList管理
 * 3. 当数据有更新时，就主动的调用ArrayList, 通知所有的（接入方）就看到最新的信息
 *
 * @author Administrator
 */
@Getter
public class WeatherData implements Subject {

    private float temperature;

    private float pressure;

    private float humidity;

    /**
     * 观察者集合
     */
    private final ArrayList<Observer> observers;

    public WeatherData() {
        observers = new ArrayList<>();
    }

    /**
     * 当数据有更新时，就调用setData
     *
     * @param temperature 温度
     * @param pressure    气压
     * @param humidity    湿度
     */
    public void setData(float temperature, float pressure, float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;

        // 调用dataChange，将最新的信息推送给接入方currentConditions
        dataChange();
    }

    /**
     * 注册一个观察者
     *
     * @param observer 观察者
     */
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    /**
     * 移除一个观察者
     *
     * @param observer 观察者
     */
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    /**
     * 调用接入方的update
     */
    public void dataChange() {
        notifyObservers();
    }

    /**
     * 遍历所有的观察者，并通知
     */
    @Override
    public void notifyObservers() {
        observers.forEach(observer -> observer.update(this.temperature, this.pressure, this.humidity));
    }
}
